bitkeeper revision 1.1509 (42919998wk9fYs94aYbRCzMaqW0N5w)
authorleendert@watson.ibm.com[kaf24] <leendert@watson.ibm.com[kaf24]>
Mon, 23 May 2005 08:51:36 +0000 (08:51 +0000)
committerleendert@watson.ibm.com[kaf24] <leendert@watson.ibm.com[kaf24]>
Mon, 23 May 2005 08:51:36 +0000 (08:51 +0000)
[PATCH] [PATCH] VMX: bad PIO/MMIO effective address computations

The PIO/MMIO effective address computations in VMX for partitions running
in VM8086 mode are wrong. This bug prevented FreeDOS and Lilo to work under
VMX. The following patches fix this.

Leendert

Signed-Off-By: Leendert van Doorn <leendert@watson.ibm.com>
xen/arch/x86/vmx.c
xen/arch/x86/vmx_platform.c

index fecc98f7911235e9d4f721fa970c08e2e877c5e0..c98913f57810b5d46b8e592b6f7cc50437ae6f86 100644 (file)
@@ -366,11 +366,11 @@ static void vmx_io_instruction(struct cpu_user_regs *regs,
             if (p->dir == IOREQ_WRITE) {
                 __vmread(GUEST_DS_SELECTOR, &seg);
                 p->u.pdata = (void *)
-                        ((seg << 4) | (regs->esi & 0xFFFF));
+                        ((seg << 4) + (regs->esi & 0xFFFF));
             } else {
                 __vmread(GUEST_ES_SELECTOR, &seg);
                 p->u.pdata = (void *)
-                        ((seg << 4) | (regs->edi & 0xFFFF));
+                        ((seg << 4) + (regs->edi & 0xFFFF));
             }
         } else {
                p->u.pdata = (void *) ((p->dir == IOREQ_WRITE) ?
@@ -378,7 +378,6 @@ static void vmx_io_instruction(struct cpu_user_regs *regs,
         }
         p->u.pdata = (void *) gva_to_gpa(p->u.data);
 
-
         if (test_bit(5, &exit_qualification))
            p->count = vm86 ? regs->ecx & 0xFFFF : regs->ecx;
         if ((p->u.data & PAGE_MASK) != 
index 1b304acb535d91fe5056437ac0b3021156aa59d6..14ef2d2d24fa304b1e0a2f62783139fd4fdb6bad 100644 (file)
@@ -544,7 +544,7 @@ void handle_mmio(unsigned long va, unsigned long gpa)
 
     if (vm86) {
         __vmread(GUEST_CS_SELECTOR, &cs);
-        inst_addr = (cs << 4) | eip;
+        inst_addr = (cs << 4) + eip;
     } else
         inst_addr = eip; /* XXX should really look at GDT[cs].base too */
 
@@ -592,13 +592,13 @@ void handle_mmio(unsigned long va, unsigned long gpa)
            unsigned long seg;
 
            __vmread(GUEST_ES_SELECTOR, &seg);
-           if (((seg << 4) | (inst_decoder_regs->edi & 0xFFFF)) == va) {
+           if (((seg << 4) + (inst_decoder_regs->edi & 0xFFFF)) == va) {
                dir = IOREQ_WRITE;
                __vmread(GUEST_DS_SELECTOR, &seg);
-               addr = (seg << 4) | (inst_decoder_regs->esi & 0xFFFF);
+               addr = (seg << 4) + (inst_decoder_regs->esi & 0xFFFF);
            } else {
                dir = IOREQ_READ;
-               addr = (seg << 4) | (inst_decoder_regs->edi & 0xFFFF);
+               addr = (seg << 4) + (inst_decoder_regs->edi & 0xFFFF);
            }
        } else { /* XXX should really look at GDT[ds/es].base too */
            if (va == inst_decoder_regs->edi) {